#ifndef JEU_H_INCLUDED
#define JEU_H_INCLUDED

#include "Chevalet.h"
#include "Terrain.h"
#include "Verification.h"
#include "Joueur.h"


/**
 @struct sJeu
 @brief structure Jeu permetant d'accéder à tous les éléments constitutifs du jeu (Terrain, joueur etc.)
 @param nbJoueurs le nombre desJoueurs d'une partie
 @param pTer est un pointeur sur une structure de type \e Terrain
 @param pChev est un pointeur sur une structure de type \e Chevalet
 @param tabJoueurs est un pointeur sur un tableau de \e Joueur
*/
struct sJeu
{
    int nbJoueurs;
 Joueur ** tabJoueurs;
 Chevalet * pChev;
 Terrain * pTer;

};typedef struct sJeu Jeu;

/**
    @fn jeuInit(Jeu* pJeu)
    @brief Procédure permettant d'initialiser le jeu
    @param pJeu [IN-OUT] pointeur sur une structure \e Jeu
*/
void jeuInit(Jeu* pJeu);

/**
    @fn jeuLib(Jeu * pJeu)
    @brief Libere espace occupé par le jeu
    @param pJeu [IN-OUT]  pointeur sur une structure \e Jeu

*/

void jeuLib(Jeu * pJeu);

/**
 	@fn jeuGetTerrain(const Jeu *pJeu)
 	@brief Fonction permettant de récuperer l'adresse du Terrain en mémoire
	@param pJeu [IN] pointeur sur une structure \e Jeu
	@return L'adresse du Terrain
*/

Terrain * jeuGetTerrain(const Jeu *pJeu);

/**
    @fn jeuGetChev(const Jeu *pJeu)
    @brief Fonction permettant de récupérer l'adresse du Chevalet en memoire
    @param pJeu [IN]  pointeur sur une structure \e Jeu
    @return L'adresse du Chevalet

*/

Chevalet * jeuGetChev(const Jeu *pJeu);

/**
	@fn reInitTer(Jeu *pJeu)
	@brief Procédure permettant de réinitialiser le Terrain
	@details Cette procédure est appelé après avoir joué sur une case Vortex
	@param pJeu [IN-OUT]  pointeur sur une structure \e Jeu
*/
void reInitTer(Jeu *pJeu);

/**
	@fn reInitChev(Jeu *pJeu)
	@brief Procédure permettant de réinitialiser le Chevalet
	@details Cette procédure est appelé après avoir joué sur une case Vortex
	@param pJeu [IN-OUT]  pointeur sur une structure \e Jeu
*/

void reInitChev (Jeu *pJeu);
/**
    @fn jeuCalculScore(const int *x, const int *y,const int res_formeMot,const Terrain * pTer, const int taille)
    @brief  Fonction permettant de calculer le nombre de point à marquer pour un mot
    @param  x [IN] est un tableau d'entiers contenant les ordonnées des lettres jouées
    @param  y [IN] est un tableau d'entiers contenant les ordonnées des lettres jouées
    @param  res_formeMot [IN]  Un entier résultant de la fonction #verifFormeMot
    @param  pTer [IN] un  pointeur sur \e Terrain
    @param  taille [IN] représente le nombre de lettres jouées et donc la taille des tableaux passés en paramètre
*/

unsigned int jeuCalculScore(const int *x, const int *y,const int res_formeMot,const Terrain * pTer, const int taille);

/**
    @fn void remettreLettreDansChev(Terrain * pTer,Chevalet * pChev,int * pTabX, int * pTabY,int nbLettrePose);
    @brief Procédure permettant de remettre des lettres dans le chevalet lors d'une erreur
    @details Si on constate une erreur lors des vérifications (cf. #Verification), toutes les lettres doivent être reposé dans le chevalet
    @param  pTabX [IN-OUT] est un tableau d'entiers contenant les ordonnées des lettres jouées
    @param  pTabY [IN-OUT] est un tableau d'entiers contenant les ordonnées des lettres jouées
    @param  pTer [IN-OUT] un  pointeur sur \e Terrain
    @param  nbLettrePose [IN-OUT] représente le nombre de lettres jouées et donc la taille des tableaux passés en paramètre

*/

void remettreLettreDansChev(Terrain * pTer,Chevalet * pChev,int * pTabX, int * pTabY,int nbLettrePose);

void testRegression_Jeu();
#endif
